#include <dbg.h>

#include <cassert>

using namespace std;

class Solution {
public:
    int numberOfSubstrings(string s) {
        vector<int> cnt(3, 0);  // a, b, c
        int res = 0;
        int n = s.size();
        int left = 0;
        for (int right = 0; right < n; right++) {
            ++cnt[s[right] - 'a'];                // 窗口内的字符数量
            while (cnt[0] && cnt[1] && cnt[2]) {  // 窗口内的字符数量都不为0
                --cnt[s[left] - 'a'];
                ++left;
            }
            res += left;  // 左端点在 0,1,2,…,left−1 的所有子串都是合法的
        }
        return res;
    }
};

int main() {
    Solution s;

    assert(s.numberOfSubstrings("abcabc") == 10);
    assert(s.numberOfSubstrings("aaacb") == 3);
    assert(s.numberOfSubstrings("abc") == 1);

    return 0;
}